
/**********************************************************************************\
** 文件名称: catch.c
** 创建人员: YCG
** 创建日期: 2019-01-15
** 文档描述: 
1. CacheHead_t 缓存头部结构体，包含了一个列表头
2. CacheGet    通过MyMalloc申请一段内存空间插入到缓存列表中
3.

** 版本代号: V0.1
** 版本说明: 初始版本
\********************************************************************************/
#include	"cache.h"

/*******************************************************************************
** 函数名称: CacheGet
** 功能描述: 获取数据块，并插入列表中
** 参数说明: yCacheHead: [输入] 插入的列表
**			     ySize:      [输入] 数据块大小
** 返回说明: 数据块的地址
** 创建人员: YCG
** 创建日期: 2019-01-15
********************************************************************************/
CacheItem_t* CacheGet(CacheHead_t* yCacheHead, uint32_t ySize) {
	
    CacheItem_t *yCache = (CacheItem_t*)MyMalloc(ySize + sizeof(CacheItem_t)); //申请内存空间
	
    if(yCache != NULL) {  //如果成功分配到空间
			
        yCache->Next = NULL;           //加到末尾的，因此下一个为空
        yCache->Size = ySize;          //数据块的大小

        /*将数据块添加进去列表*/
        if(yCacheHead->End != NULL) {         //列表不为空
            yCacheHead->End->Next = yCache;   //将数据块接在列表的末尾
            yCacheHead->End = yCache;         //更新尾部指针

        } else {	                            //列表是空的
            yCacheHead->Start = yCache;		    //将首部指向当前数据块
            yCacheHead->End   = yCache;       //将尾部指向当前数据块
        }
    }
    return yCache;     //返回分配的内存地址
}

/*******************************************************************************
** 函数名称: CacheUse
** 功能描述: 记录已经使用了的数据块大小，释放掉未使用的内存空间
** 参数说明: yCache: [输入]  数据块的首地址
**			     ySize: [输入]   已经使用了的数据块大小
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-01-17
********************************************************************************/
void CacheUse(CacheItem_t* yCache, uint32_t ySize) {
	
    if(yCache->Size > ySize+sizeof(CacheItem_t)) {    //需要加上缓存列表头部的大小
        yCache->Size = ySize;       //已经使用的空间
        MyFreeUnuse(yCache, ySize+sizeof(CacheItem_t));  //释放掉未使用的内存空间
    }
}

/*******************************************************************************
** 函数名称: CacheRead
** 功能描述: 读取数据块，并释放掉上一次的数据块
** 参数说明: yCacheHead: [输入] 数据块列表
** 返回说明: None
** 创建人员: YCG
** 创建日期: 2019-01-15
********************************************************************************/
CacheItem_t* CacheRead(CacheHead_t* yCacheHead) {

    CacheItem_t *yCache = yCacheHead->Start;   //获取当前的数据块

    MyFree(yCacheHead->Last);                  //删除上次的数据块
    yCacheHead->Last = yCache;                 //保存本次使用的数据块地址，方便下次删除

    if(yCacheHead->Start != yCacheHead->End) {       //没有读取到末尾
        yCacheHead->Start = yCacheHead->Start->Next; //切换到下一个
    } else {	                       //读取到末尾了
        yCacheHead->Start = NULL;			//清空，表示已经传输完成
        yCacheHead->End   = NULL;
    }
    return yCache;
}

/********************************End of File************************************/
